home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Deutsche Edition 1
/
Deutsche Edition 1.iso
/
amok
/
051-060
/
amok51
/
detachfile
/
detachit.asm
< prev
next >
Wrap
Assembly Source File
|
1993-11-04
|
6KB
|
225 lines
;------------------------------------------------------------------------------
;
; Detach
;
;------------------------------------------------------------------------------
sysbase equ 4
FindName equ -276
WaitPort equ -384
DupLock equ -96
Delay equ -198
UnLock equ -90
UnLoadSeg equ -156
Open equ -30
Close equ -36
Forbid equ -132
CreateProc equ -138
Permit equ -138
GetMsg equ -372
ReplyMsg equ -378
OpenLibrary equ -552
CloseLibrary equ -414
Me EQUR A4
thisTask EQU 276
cli EQU 172
cis EQU 156
cos EQU 160
section "Startup",code
start
move.l $4,A6
move.l 276(A6),Me ; Exec.thisTask
tst.l cli(Me) ; pr_CLI
bne.s fromdos
jmp mainwb
fromdos:
move.l D0,arglen;
lea args,A1;
and.w #$FF,D0
doubargs: move.b (A0)+,(A1)+
dbra D0,doubargs
lea dosname(PC),a1
move.l #33,D0
jsr OpenLibrary(A6)
move.l d0,dosbase;
lea start-4(PC),A1;start = effektiver Prg-Anf.
move.l (A1),mySeg
move.l (A1),CLI+60
clr.l (a1)
move.l 4,a0
move.l 276(a0),a0 ;ThisTask
move.l 152(a0),d1 ;pr_currentDir
move.l dosbase,A6;
jsr DupLock(A6);
move.l d0,curDir
bne.s \lockok
moveq #20,d0;
rts;
\lockok:
move.l $4,A6;
jsr Forbid(A6);
move.l #newname,d1 ;newname
clr.l d2 ;
move.b 9(Me),d2 ;Me.task.node.pri
move.l #mainprg,d3 ;woher?
subq #4,d3
lsr.l #2,d3 ;BPTR *seglist
move.l 132(Me),d4 ;Me.stackSize
move.l dosbase,A6;
jsr CreateProc(A6)
sub.l #92,D0
move.l d0,a0
move.l curDir,152(a0)
lea.l CLI,a1;
move.l a1,d0
lsr.l #2,d0;
move.l d0,cli(A0);
subq.l #1,d0;
move.l d0,4(a1);
move.l d0,16(a1);
move.l d0,24(a1);
move.l d0,36(a1);
move.l $4,A6;
jsr Permit(A6);
moveq #0,d0
rts
dosname dc.b 'dos.library',0
EVEN
section "Main",code
mainprg:
move.l dosbase,A6;
move.l #nilname,D1;
move.l #1005,D2;
jsr Open(A6);
move.l d0,in
beq.s quit;
move.l #nilname,D1;
move.l #1006,D2;
jsr Open(A6);
move.l d0,out;
beq.s quit
move.l $4,Me;
move.l thisTask(Me),Me;
move.l in,cis(Me);
move.l out,cos(Me)
lea.l CLI,A1;
move.l curDir,8(A1)
move.l in,28(A1);
move.l in,32(A1);
move.l out,48(A1);
move.l out,56(A1);
move.l arglen,D0;
lea.l args,A0;
mainwb: jsr Program
move.l 8+CLI,curDir
quit: move.l D0,D3
move.l curDir,D1;
beq.s \nolock
move.l dosbase,A6;
jsr UnLock(A6);
move.l $4,A6;
jsr Forbid(A6);
move.l dosbase,A6;
move.l mySeg,D1;
jsr UnLoadSeg(A6);
move.l in,D1
beq.s \a
jsr Close(A6)
\a: move.l out,D1
beq.s \b
jsr Close(A6)
\b: move.l A6,A1
move.l $4,A6;
jsr CloseLibrary(A6);
\nolock: move.l D3,D0
rts
newname dc.b 'Detached',0
even
nilname dc.b 'NIL:',0
section "DetachVars",bss
dosbase dc.l 0
curDir dc.l 0
mySeg dc.l 0
in dc.l 0
out dc.l 0
args ds.b 256
arglen dc.l 0
dummystr dc.b 1,'?',0,0
CLI ds.l 16;
;------------------------------------------------------------------------------
;
; Hier beginnt unabhängiges Programm:
;
;------------------------------------------------------------------------------
section "Program",code
Program: move D0,D3
move.l $4,A6
move.l thisTask(A6),Me
tst.l cli(Me);
bne.s \scli
lea.l $5c(Me),A0;
jsr WaitPort(A6);
lea.l $5c(Me),A0;
jsr GetMsg(A6);
move.l D0,wbmsg;
\scli:
lea doslib(PC),a1
move.l #33,D0
jsr OpenLibrary(A6)
move.l d0,dos;
beq.s nodos;
cmp #1,D3;
bhi.s loop
move #100,D3
loop: bchg.b #1,$bfe001;
moveq #1,D1
move.l dos,A6;
jsr Delay(A6);
dbf D3,loop
move.l $4,A6;
move.l dos,A1;
jsr CloseLibrary(A6);
nodos: tst.l cli(Me);
bne.s \scli
jsr Forbid(A6);
move.l wbmsg(PC),A1;
jsr ReplyMsg(A6);
\scli: moveq #0,D0;
rts
wbmsg: dc.l 0;
dos: dc.l 0;
doslib: dc.b "dos.library",0
end